/* Filename: primer1.c
 * Description: 多进程,每个进程计算区间内1个数
 * Last modified: humble 20200322 17:05
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

#define LEFT (30000000)
#define RIGHT (30000200)

static void usage(void);

int main(int argc, char **argv) {
    if(argc != 1){ fprintf(stderr, "argc !=1"); usage(); exit(1); }
    int mark;
    pid_t pid;
    for(int i = LEFT; i < RIGHT; i++) {
        pid = fork();
        if(pid < 0){ perror("fork()"); exit(1); } // 创建失败
        else if(pid == 0){ // 子进程
            mark = 1;
            for(int j = 2; j < i/2; j++) {
                if(i % j == 0){ mark = 0; break; }
            }
            if(mark == 1){ printf("%d is a primer\n", i); }
            //sleep(1000); // 父先exit()，子sleep()，用ps axf可以看到201个状态为S的子进程(孤儿进程)，被init接管，它们成为init的子进程
            exit(0); // 在循环内fork()请务必注意子进程是否需要继承循环，不需要就exit()
        }
        else{ continue; } // 父进程
    }
    //sleep(1000); // 子先exit(),父sleep()，用ps axf可以看到201个状态为Z的子进程(僵尸进程)
    return 0;
}

static void usage(void) {
#define USAGE "Usage:\n\
  Helloworld\n"
    printf(USAGE);
}
